/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.gob.dirpen.model;

import pe.gob.dirpen.factory.*;
import pe.gob.dirpen.beans.*;
import java.sql.*;
import java.util.*;

/**
 *
 * @author gcarlos
 */
public class GestionUsuario {

    public List<UsuarioBean> validarUsuario(LoginForm vf) {
        Connection cn = null;
        List<UsuarioBean> usuarios = new ArrayList<UsuarioBean>();
        try {
            cn = ConnectionPool.obtenerConexionOracle();
            String sql = "SELECT  U.NUSUA_IDENTIFICADOR,PU.NPERF_IDENTIFICADOR,";
            sql += " U.CUSUA_USERNAME, U.NPEPO_IDENTIFICADOR,";
            sql += " P.NPERS_IDENTIFICADOR,P.CPERS_APEPATERNO,";
            sql += " P.CPERS_APEMATERNO,P.CPERS_NOMBRE,";
            sql += " P.CPERS_APEPATERNO ||' ' || P.CPERS_APEMATERNO || ', ' || P.CPERS_NOMBRE AS CPERS_APENOM,";
            sql += " NVL(P.CGRAD_DESCRIPCION,'[CIVIL]') AS CGRAD_DESCRIPCION";
            sql += " FROM SEGMA_USUARIO U";
            sql += " INNER JOIN PERMA_PERSONALPOLICIAL PP";
            sql += " ON PP.NPEPO_IDENTIFICADOR = U.NPEPO_IDENTIFICADOR";
            sql += " INNER JOIN PERMA_PERSONA P";
            sql += " ON P.NPERS_IDENTIFICADOR = PP.NPERS_IDENTIFICADOR";
            sql += " INNER JOIN SEGDE_PERFILUSUARIO PU";
            sql += " ON PU.NUSUA_IDENTIFICADOR = U.NUSUA_IDENTIFICADOR ";
            sql += " WHERE U.CUSUA_USERNAME = ?";
            sql += " AND U.CUSUA_CLAVE = TOOLKIT.ENCRYPT(?)";
            sql += " AND U.BUSUA_ACTIVO=1";
            sql += " AND U.BUSUA_ELIMINADO=0";
            PreparedStatement ps = cn.prepareStatement(sql);
            ps.setString(1, vf.getUsuario());
            ps.setString(2, vf.getPassword());
            ResultSet rs = ps.executeQuery();
            
            if (rs.next()) {
                UsuarioBean usuario = new UsuarioBean();
                usuario.setNusua_identificador(rs.getInt("NUSUA_IDENTIFICADOR"));
                usuario.setCusua_username(rs.getString("CUSUA_USERNAME"));
                usuario.setNpepo_identificador(rs.getInt("NPEPO_IDENTIFICADOR"));
                usuario.setNpers_identificador(rs.getInt("NPERS_IDENTIFICADOR"));
                usuario.setNperf_identificador(rs.getInt("NPERF_IDENTIFICADOR"));
                usuario.setCpers_apepaterno(rs.getString("CPERS_APEPATERNO"));
                usuario.setCpers_apematerno(rs.getString("CPERS_APEMATERNO"));
                usuario.setCpers_nombre(rs.getString("CPERS_NOMBRE"));
                usuario.setCpers_apenom(rs.getString("CPERS_APENOM"));
                usuario.setCgrad_descripcion(rs.getString("CGRAD_DESCRIPCION"));
                usuarios.add(usuario);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            ConnectionPool.liberarConexion(cn);
        }
        return usuarios;
    }

    /************************
     *
     * @param usuario
     * @return List<ModuloBean>
     */
    public List<ModuloBean> obtenerModuloAcceso(UsuarioBean usuario) {
        Connection cn = null;
        List<ModuloBean> listaModulos = new ArrayList<ModuloBean>();
        int idAplicacion = this.obtenerIdAplicacion();
        try {
            cn = ConnectionPool.obtenerConexionOracle();
            String sql = "SELECT NMODU_IDENTIFICADOR, CMODU_DESCRIPCION,";
            sql += " BMODU_ACTIVO,NAPLI_IDENTIFICADOR,NMODU_ORDEN";
            sql += " FROM SEGMA_MODULO";
            sql += " WHERE BMODU_ACTIVO=1";
            sql += " AND NAPLI_IDENTIFICADOR=?";
            sql += " AND NMODU_IDENTIFICADOR IN (";
            sql += " SELECT R.NMODU_IDENTIFICADOR FROM SEGMA_RECURSO R";
            sql += " INNER JOIN SEGMA_PERFILRECURSO PR";
            sql += " ON  R.NRECU_IDENTIFICADOR = PR.NRECU_IDENTIFICADOR";
            sql += " WHERE NPERF_IDENTIFICADOR = ?)";
            sql += " ORDER BY NMODU_ORDEN";
            PreparedStatement ps = cn.prepareStatement(sql);
            ps.setInt(1, idAplicacion);
            ps.setInt(2,usuario.getNperf_identificador());
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                ModuloBean modulo = new ModuloBean();
                modulo.setNmodu_identificador(rs.getInt("NMODU_IDENTIFICADOR"));
                modulo.setCmodu_descripcion(rs.getString("CMODU_DESCRIPCION"));
                modulo.setBmodu_activo(rs.getString("BMODU_ACTIVO"));
                modulo.setNapli_identificador(rs.getInt("NAPLI_IDENTIFICADOR"));
                modulo.setNmodu_orden(rs.getInt("NMODU_ORDEN"));
                listaModulos.add(modulo);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            ConnectionPool.liberarConexion(cn);
        }
        return listaModulos;
    }

    /************************
     *
     * @param usuario
     * @param modulo
     * @param nenti_codigo
     * @return List<OpcionBean>
     */
    public List<OpcionBean> obtenerOpcionModulo(List<ModuloBean> modulo, UsuarioBean usuario) {
        Connection cn = null;
        List<OpcionBean> listaOpciones = new ArrayList<OpcionBean>();
        for (ModuloBean m : modulo) {
            try {
                cn = ConnectionPool.obtenerConexionOracle();
                String sql = "SELECT NRECU_IDENTIFICADOR,";
                sql += " CRECU_NOMBRE,BRECU_ACTIVO,";
                sql += " CRECU_URL,NMODU_IDENTIFICADOR,";
                sql += " BRECU_ELIMINADO,NRECU_ORDEN";
                sql += " FROM SEGMA_RECURSO";
                sql += " WHERE NMODU_IDENTIFICADOR=? ";
                sql += " AND NRECU_IDENTIFICADOR IN (SELECT NRECU_IDENTIFICADOR";
                sql += " FROM SEGMA_PERFILRECURSO";
                sql += " WHERE NPERF_IDENTIFICADOR=?)";
                sql += " ORDER BY NRECU_ORDEN";
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setInt(1,m.getNmodu_identificador());
                ps.setInt(2,usuario.getNperf_identificador());
                ResultSet rs = ps.executeQuery();
                while (rs.next()) {
                    OpcionBean opciones = new OpcionBean();
                    opciones.setNrecu_identificador(rs.getInt("NRECU_IDENTIFICADOR"));
                    opciones.setCrecu_nombre(rs.getString("CRECU_NOMBRE"));
                    opciones.setBrecu_activo(rs.getString("BRECU_ACTIVO"));
                    opciones.setCrecu_url(rs.getString("CRECU_URL"));
                    opciones.setNmodu_identificador(rs.getInt("NMODU_IDENTIFICADOR"));
                    opciones.setBrecu_eliminado(rs.getString("BRECU_ELIMINADO"));
                    opciones.setNrecu_orden(rs.getInt("NRECU_ORDEN"));
                    listaOpciones.add(opciones);
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            } finally {
                ConnectionPool.liberarConexion(cn);
            }
        }
        return listaOpciones;
    }

    private int obtenerIdAplicacion() {
        ResourceBundle res = ResourceBundle.getBundle("pe/gob/dirpen/struts/ApplicationResource");
        String identificadorAplicacion = (String) res.getObject("identificadorAplicacion");
        return Integer.parseInt(identificadorAplicacion);

    }
}
